#ifndef LOCOMANAGER_H_INCLUDE_
#define LOCOMANAGER_H_INCLUDE_

#include "singleton.h"
#include "loco.h"

#include <vector>
#include <mutex>

class LocoManager : public Singleton<LocoManager>
{
public:
    LocoManager();
    ~LocoManager();

    /// 添加一个机车到系统中
    bool addLoco(wxString locoName,wxString sectName,int state=SwitchState::POSITIVE,bool isGetPosition=false,int dir=0);
    bool addLocos(wxVector<wxString> locoName,wxString sectName,int state=SwitchState::POSITIVE,int dir=0);
    /// 删除一个机车
    void deleteLocoByName(wxString locoName);
    /// 通过ID删除机车
    void deleteLocoById(int locoId);
    /// 通过轨道方向删除机车
    void deleteLocoByTrack(wxString sectName,int state=SwitchState::POSITIVE,int dir=0);
    /// 移动机车
    bool moveLoco(int srcLocoId,wxString decLocoName);
    /// 移动机车2
    bool moveLoco2(wxString sectName,int dir=0);
    /// 更改机车
    bool changeLoco(int srcLocoId,wxVector<wxString> decLocoName);
    /// 连接机车
    bool couplingLoco(int leftLocoId,int rightLocoId);
    /// 分离机车
    bool uncouplingLoco(int leftLocoId,int rightLocoId);
    /// 删除所有机车
    void deleteAllLocos(void);
    /// 得到指定名称的机车
    Loco* getLocoByName(wxString locoName);
    /// 得到指定名称的轨道
    Track* getTrackByName(wxString sectName);
    /// 得到当前选中轨道的名称
    wxString getSelectedTrackName(void);
    /// 得到当前选中机车的名称
    wxString getSelectedLocoName(void);
    /// 得到当前选中机车的ID
    int getSelectedLocoId(void);

    /// 工作区域改变
    void changeWorkingRect(wxString sectName="");
    /// 更新
    void update(void);
    /// 绘制
    void draw(maindrawscene *painter);
    /// 处理鼠标事件
    bool OnMMouseEvent(wxMouseEvent event);

private:
    /// 删除机车
    void deleteLoco(Loco *ploco);

private:
    std::mutex mTrackMutex,m_LocoMutex;         /**< 用于保护所有的结点 */
    std::map<wxString,Track> mTracks;           /**< 所有的股道 */
    std::vector<Loco*> mLocos;                  /**< 用于管理所有的机车 */
};

#endif // LOCOMANAGER_H
